'''程序日志：
目的：实现文件的合并功能
输入：1、需要合并的文件夹地址；2、合并后文件的输出地址
输出：合并后的Excle文件
程序结构：
    1、变量定义：SourcePath，需要合并文件的文件夹地址；
    2、功能模块：
        主模块：
        文件清单列表获取：
            OS：模块获取文件名称列表
              ：创建详细地址列表，列表元素为 文件夹地址+文件名

        文件合并操作:将得到的待合并文件地址列表和输出文件地址提供给合并函数，实现合并和输出

'''

import os
import xlrd,xlsxwriter

# 待合并文件的 "文件夹地址"
SourcePath = "C:\\Users\\chunxiao.ding\\Desktop\\待合并的文件"

# 合并后文件的 "绝对地址",注意，合并后的文件夹需要事先建立好
end_xls="C:\\Users\\chunxiao.ding\\Desktop\\合并后的文件\\合并.xlsx"

# 待合并文件的列表
SourceFileList = os.listdir(SourcePath)

# 待合并文件的绝对地址的列表
SourceFilePathList = []

#循环遍历，创建文件绝对地址的列表
for i in SourceFileList:
    SourceFilePathList.append(SourcePath+"\\"+i)

#print(SourceFilePathList)





#文件的合并功能，从网络获取
def open_xls(file):
    try:
        fh=xlrd.open_workbook(file)
        return fh
    except Exception as e:
        print("打开文件错误："+e)


#根据excel名以及第几个标签信息就可以得到具体标签的内容
def get_file_value(filename,sheetnum):
    rvalue=[]
    fh=open_xls(filename)
    sheet=fh.sheets()[sheetnum]
    row_num=sheet.nrows
    for rownum in range(0,row_num):
        rvalue.append(sheet.row_values(rownum))
    return rvalue


#获取第一个excel的sheet个数以及名字作为标准
first_file_fh=open_xls(SourceFilePathList[0])
first_file_sheet=first_file_fh.sheets()
first_file_sheet_num=len(first_file_sheet)
sheet_name=[]
for sheetname in first_file_sheet:
    sheet_name.append(sheetname.name)


#定义一个目标excel
endxls=xlsxwriter.Workbook(end_xls)

all_sheet_value=[]

#把所有内容都放到列表all_sheet_value中
for sheet_num in range(0,first_file_sheet_num):
    all_sheet_value.append([])
    for file_name in SourceFilePathList:
        print("正在读取"+file_name+"的第"+str(sheet_num+1)+"个标签...")
        file_value=get_file_value(file_name,sheet_num)
        all_sheet_value[sheet_num].append(file_value)

#print(all_sheet_value)

num=-1
sheet_index=-1

#将列表all_sheet_value的内容写入目标excel
for sheet in all_sheet_value:
    sheet_index+=1
    end_xls_sheet=endxls.add_worksheet(sheet_name[sheet_index])
    num+=1
    num1=-1
    for sheet1 in sheet:
        for sheet2 in sheet1:
            num1+=1
            num2=-1
            for sheet3 in sheet2:
                num2+=1
                #print(num,num1,num2,sheet3)
                #在第num1行的第num2列写入sheet3的内容
                end_xls_sheet.write(num1,num2,sheet3)


endxls.close()
print("合并完成！")
